function EventManager(){
    
    this.eventList=Array();//cache eventi, associativo, eventList[id_evento]=evento...
    this.eventListToShow=Array();//contiene gli id degli eventi da mostrare
    //this.constant_backendEvents="utility/backend.evtList.php";
    //this.constant_backendEventIds="utility/backend.evtIdList.php";
    this.constant_backendEventIds="http://admin.festivalscienza.it/jsonget.php?get=id";
    this.constant_backendEvents="http://admin.festivalscienza.it/jsonget.php?get=event";
    this.externalEventSources=Array(); //interfaccia implementata da vedere in alberghi
    //this.pathEvent;

    /**
     * Funzione che dapprima carica la lista di identificativi degli eventi da
     * visualizzare, la salva e successivamente carica gli eventi stessi a partire
     * dai loro identificativi. Parte 1: carico gli id degli eventi
     */
    this.loadEvents=function(listaCategorie,data,orainizio,orafine,nome,callback){
        var objconn=new Object();
        objconn.params=new Object();
        //alert(dump(listaCategorie));
        for(var i in listaCategorie){
            if(!isNaN(i)){
                //togliere le funzioni
                if(typeof listaCategorie[i] != 'function')
                    objconn.params['pc_'+listaCategorie[i]]=1;
            }
        }
        //alert("objconn"+objconn.params);
        if(nome)
            objconn.params['nome']=nome;
        if(data){
            if(!orainizio){
                orainizio="00:00";
            }
            if(!orafine){
                orafine="23:59";
            }
            objconn.params["dt_"+data+"_"+orainizio+"_"+orafine+""]=1;
        }
        //        //alert(dump(objconn));
        //        conn.request(objconn);
        jsonQuery(objconn.params, evtman.constant_backendEventIds, function(responseObject){
            //evtman.loadEventsFromIds(responseObject.responseText,callback);
            evtman.loadEventsFromIds(responseObject,callback);
        }, function(){
            printErrorMessage('Errore', 'Si &egrave; verificato un errore nel corso del caricamento della lista di id eventi filtrati. Ricaricare la pagina. Se il problema persiste contattare l\'amministratore di sistema '+evtman.constant_backendEvents);
        });
    }

    
    /**
     * parte 2: codifico gli id degli eventi e preparo la richiesta per caricare
     * gli eventi stessi.
     */
    this.loadEventsFromIds=function(encodedIds,callback){
        try {
            //elimino tutti i dati relativi agli eventi che ho mostrato nelle
            //precedenti puntate
            evtman.eventListToShow=Array();
            //processo stringin
            if(encodedIds!=""){
                //var decoding=Ext.util.JSON.decode(encodedIds);
                var decoding=removeJsonpPaddign(encodedIds);
                
                for(var dect in decoding){
                    if(!isNaN(dect)){
                        //se tra gli eventi presenti
                        evtman.eventListToShow.push(decoding[dect]["id"]);
                    }
                }
            }
            evtman.loadEventsFromIdArray(evtman.eventListToShow, callback);
        } catch (err){
            alert("loadEventsFromIds: errore\n"+err.toString());
        }
    }


    /**
     * parte 2/bis: Funzione che, dato un percorso, permette di caricare tutti
     * gli eventi ad esso relativi per mostrarli in un secondo momento
     */
    this.loadEventsFromPath=function(path,callback){
        var listaEventi=path['eventi'];
        this.eventListToShow=Array();
        var listaIds=Array();
        //this.pathEvent=path;
        try{
            for(var idevt in listaEventi){
                //alert(dump(listaEventi[idevt]));
                listaIds.push(listaEventi[idevt]['id']);
            }
            this.eventListToShow=listaIds;
            evtman.loadEventsFromIdArray(listaIds, callback);
        } catch(err){
            alert("loadEventsFromPath: errore\n"+err.toString());
        }
    }

    /**
     * parte 2.5: permette di caricare gli eventi a partire da un array di Id,
     * successivamente viene chiamata la funzione di callback. Questa parte è
     * stata isolata dalla precedente affinchè fosse possibile caricare gli
     * eventi anche a partire da un array di Id passato esternamente, come
     * quello calcolato a partire da un percorso
     */
    this.loadEventsFromIdArray=function(arrayId,callback){
        //var conn = new Ext.data.Connection();
        //var regexp=/[0-9]+_[0-9]+/;
        try{
            params=new Object();
            for(var j in arrayId){
                if(!isNaN(arrayId[j]))
                    params["evt_"+arrayId[j]]=1;
            }
            jsonQuery(params, evtman.constant_backendEvents, function(responseObject) {
                //evtman.loadEncodedEventData(responseObject.responseText,callback);
                evtman.loadEncodedEventData(responseObject,callback);
            }, function() {
                Ext.Msg.alert('Errore', 'Si &egrave; verificato un errore nel corso del caricamento della lista di eventi. Ricaricare la pagina. Se il problema persiste contattare l\'amministratore di sistema '+evtman.constant_backendEvents);
            });
        } catch (err){
            alert("loadEventsFromIdArray: errore\n"+err.toString());
        }
    }

    /**
     * passo 3
     * parte finale della funzione: finisce di caricare gli eventi effettuando
     * il caching per non ricaricare quelli già presenti,
     */
    this.loadEncodedEventData=function(encodedEvents,callback){
        var decoding, status="";

        //        alert("EEE\n"+dump(encodedEvents));
        //        alert(dump(this.eventListToShow));
        try{
            status="decode";
            if(encodedEvents!=""){
                //Ext.Msg.alert('Output', dump(encodedEvents));
                //decoding=Ext.util.JSON.decode(encodedEvents);
                decoding=removeJsonpPaddign(encodedEvents);
                status="appendToEventList";
                for(var i in decoding){
                    if(!isNaN(i)){
                        //formattazione dell'evento
                        //decoding[i]["nome"]=urldecode(decoding[i]["nome"]);
                        //decoding[i]["nome"]=urldecode(decoding[i]["nome"]);
                        //decoding[i]["descrizione"]=urldecode(decoding[i]["descrizione"]);
                        //decoding[i]["nome"]=urldecode(decoding[i]["nome"]);
                        //fine formattazione
                        if(i>1000)
                            alert(dump(decoding[i]));
                        evtman.eventList[decoding[i]["id"]]=decoding[i];
                        try{
                            evtman.eventList[decoding[i]["id"]].nome_luogo=urldecode(decoding[i].nome_luogo);
                        } catch(e){
                            alert("errore nome luogo!"+dump(e));
                        }
                        try{
                            evtman.eventList[decoding[i]["id"]].nome=urldecode(decoding[i].nome);
                        } catch(e){
                            alert("errore nome!"+dump(e));
                        }
                        try{
                            evtman.eventList[decoding[i]["id"]].descrizione=urldecode(decoding[i].descrizione);
                        } catch(e){
                            alert("errore descrizione!"+dump(e));
                        }
                    //this.eventList[decoding[i]["id"]]["descrizione"]=urldecode(decoding[i]["descrizione"]);
                        
                    }
                }
            //alert("Errori nome:"+i+" titolo:"+j+" tot:"+tot+" stringa="+tots);
            }
            if(callback)
                callback();
            status="fine";
        } catch(err){
            alert("errore in loadEncodedEventData("+status+"):"+dump(err));
        }
    }
    
    /**
     * restituisce l'array associativo di eventi (oggetti) da disegnare
     */
    this.getEventsToShow=function(){
        var ret=new Array();
        var j;
        for(var i in evtman.eventListToShow){
            if(!isNaN(evtman.eventListToShow[i])){
                j=evtman.eventListToShow[i];
                ret[j]=evtman.eventList[j];
            }
        }
        //sperimentale
        for(var ju in evtman.externalEventSources){
            if(typeof(evtman.externalEventSources[ju])!='function'){
                if(evtman.externalEventSources[ju].areEventsToShow()){
                    //alert(dump(evtman.externalEventSources[ju].getEventi()));
                    var tmpsrc=evtman.externalEventSources[ju].getEventi();
                    var tmpids=evtman.externalEventSources[ju].getEventIds();
                    for(var k in tmpids){
                        ret[tmpids[k]]=tmpsrc[tmpids[k]];
                    }
                }
            }
        }

        return ret;
    }

    /**
     * funzione che permette di fare il caching di eventi caricati a parte
     * (nel caso del festival della scienza ad esempio alberghi)
     */
    this.initExternalEvents=function(listaEventi){
        //alert(dump(listaEventi));
        for(var i in listaEventi){
            if(typeof(listaEventi[i])!='function'){
                evtman.eventList[listaEventi[i].id]=listaEventi[i];
            }
        }
    }

    /**
     * aggiunta di una sorgente di eventi esterna. La sorgente deve rispettare
     * una particolare interfaccia.
     */
    this.addExternalEventSource=function(eventSource){
        try{
            evtman.externalEventSources.push(eventSource);
            evtman.initExternalEvents(eventSource.getEventi());
        } catch(e){
            alert("Errore: "+dump(e));
        }
    }
    this.showInitEvents=function(){
        
    }
}
